package com.tdam2011.grupo06.control;

import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import com.tdam2011.grupo06.R;
import com.tdam2011.grupo06.gui.SetPreferenceNombreUsuario;
import com.tdam2011.grupo06.model.Contacto;
import com.tdam2011.grupo06.model.MensajeBob;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.preference.PreferenceManager;
import android.util.Log;

public class BobMessageService extends Service {
	private final String TAG = "BobMessageService";
	private final int NOTIFICATION_ID = R.string.notification_id;
	private Handler handler;
	private BobMessageParserSax bmps;
	private NotificationManager nm;
	private List<MensajeBob> listaMensajes;
	private boolean mensajesNuevos = false;
	
	@Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        super.onStart(intent, startId);
		Log.d(TAG, "Received start id " + startId + ": " + intent);
		handler.removeCallbacks(checkForMessages);
		handler.postDelayed(checkForMessages, 500);
        return START_STICKY;
    }
	
	private Runnable checkForMessages = new Runnable() {
		public void run() {
			List<MensajeBob> listaMensajes = checkForMessages();
			if (listaMensajes.size()>0) {
				Log.d(TAG, "hay " + listaMensajes.size() + " mensajes");
				if (mensajesNuevos) {
					showNotification(listaMensajes);
				}
			}
			handler.postDelayed(this, 2000);
		}
	};
	
	@Override
	public void onCreate() {
		super.onCreate();
		init();
	}
	
	@Override
	public void onDestroy() {		
		super.onDestroy();
		handler.removeCallbacks(checkForMessages);
		nm.cancel(NOTIFICATION_ID);
	}
	
	@Override
	public IBinder onBind(Intent intent) {
		return mBinder;
	}
	
	/** This is the object that receives interactions from clients.  See
    *RemoteService for a more complete example.
    */
    private final IBinder mBinder = new LocalBinder();
    
    /**
     * Class for clients to access.  Because we know this service always
     * runs in the same process as its clients, we don't need to deal with
     * IPC.
     */
    public class LocalBinder extends Binder {
    	public BobMessageService getService() {
            return BobMessageService.this;
        }
    }
	
	private void showNotification(List<MensajeBob> listaMensajes) {
		nm.cancel(NOTIFICATION_ID);
		CharSequence text = "";
		Log.d(TAG, "ShowNotification " + listaMensajes.size() + " mensajes nuevos");
		if (listaMensajes.size()==1) {
			text = "Tienes 1 mensaje sin leer.";
		}
		else {
			text = "Tienes " + listaMensajes.size() + " mensajes sin leer.";
		}
		Notification not = new Notification(R.drawable.icon, text, System.currentTimeMillis());
		PendingIntent intent = PendingIntent.getActivity(this, 0, new Intent(this, SetPreferenceNombreUsuario.class), PendingIntent.FLAG_CANCEL_CURRENT);
		not.setLatestEventInfo(this, getText(R.string.app_name), text, intent);
		nm.notify(NOTIFICATION_ID, not);
		mensajesNuevos = false;
	}

	private List<MensajeBob> checkForMessages() {
		Log.d(TAG, "check for messages!");
		SharedPreferences myPreference = PreferenceManager.getDefaultSharedPreferences(getBaseContext());
		DatabaseHelper db = DatabaseHelper.getInstance(getBaseContext());
		Date aux;
		if(db.getMensajesBobCountRecibidos()==0)
		{
			aux = new Date(0);
		}
		else
		{
			aux = db.getLastMensajesBobRecibido(new MensajeBob()).getFecha();
			aux.setSeconds(aux.getSeconds()+1);
		}
		List<MensajeBob>lista = bmps.parseMessages(myPreference.getString("nombreUsuario", ""), myPreference.getString("contrasenaUsuario", ""), aux);
		Iterator<MensajeBob> iter = lista.iterator();
		while(iter.hasNext())
		{
			MensajeBob mesj = iter.next();
			mesj.setUsuario(mesj.getNombre());
			mesj.setTipo(MensajeBob.recibido);
			int idContacto = db.getTableIdbyUser(mesj.getUsuario());
			if(idContacto==0)
			{
				Contacto c = new Contacto();
				c.setUsuario(mesj.getUsuario());
				idContacto = (int) db.addContacts(c);
			}
			Contacto c = new Contacto();
	    	c.setTableID(idContacto);
	    	c = db.getContactByTableId(c);
			mesj.setIdContacto(c.getTableID());
			db.addMensajeBob(mesj);
			listaMensajes.add(mesj);
			mensajesNuevos = true;
		}
		return listaMensajes;
	}

	private void init() {
		handler = new Handler();
		bmps = new BobMessageParserSax();
		nm = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
		listaMensajes = new ArrayList<MensajeBob>();
	}

	public void clearMessages() {
		Log.d(TAG, "entered clearMessages()");
		nm.cancel(NOTIFICATION_ID);
		if (listaMensajes == null) {
			listaMensajes = new ArrayList<MensajeBob>();
		}
		listaMensajes.clear();
	}
}
